/**
现给定两个数组 arr1 和 arr2 ，返回一个新的数组 joinedArray 。两个输入数组中的每个对象都包含一个 id 字段。
joinedArray 是一个通过 id 将 arr1 和 arr2 连接而成的数组。joinedArray 的长度应为唯一值 id 的长度。返回的数组应按 id 升序 排序。
如果一个 id 存在于一个数组中但不存在于另一个数组中，则该对象应包含在结果数组中且不进行修改。
如果两个对象共享一个 id ，则它们的属性应进行合并：
如果一个键只存在于一个对象中，则该键值对应该包含在对象中。
如果一个键在两个对象中都包含，则 arr2 中的值应覆盖 arr1 中的值。
示例 2：
输入：
arr1 = [
    {"id": 1, "x": 2, "y": 3},
    {"id": 2, "x": 3, "y": 6}
], 
arr2 = [
    {"id": 2, "x": 10, "y": 20},
    {"id": 3, "x": 0, "y": 0}
]
输出：
[
    {"id": 1, "x": 2, "y": 3},
    {"id": 2, "x": 10, "y": 20},
    {"id": 3, "x": 0, "y": 0}
]
解释：id 为 1 和 id 为 3 的对象在结果数组中保持不变。id 为 2 的两个对象合并在一起。arr2 中的键覆盖 arr1 中的值。
 */

var join = function(arr1, arr2) {
  const arr = [...arr1,...arr2];
  const map = {};
  for(const item of arr) {
    pre[item.id] = {...pre[item.id]||[],...item};
  }
  const joinRes = Object.values(map);
  return joinRes.sort((a,b) => a.id -b.id)
};

//reduce实现
var join = function(arr1, arr2) {
  const arr = [...arr1, ...arr2];
  const map = arr.reduce((pre,item)=> {
    pre[item.id] = {...pre[item.id]||[],...item};
    return pre
  }, {})
  const joinRes = Object.values(map);
  return joinRes.sort((a,b) => a.id -b.id)
};